FUNCTION FOR CREATING SEGMENT LABELS VS PROTEINS HEATMAP USING GMTK PARAMETERS OUTPUT

#FUNCTION FOR CREATING LABELS VS PROTEINS HEATMAP
#args csv1, csv2, label_map, must be in quotations (and preferably full paths) when passed in
#label_map can just be the name of the directory for it's particular stable marriage run
make_raw_heatmap <- function(csv1, csv2, label_dir){
  library(ComplexHeatmap)
  gmtkdata1 <- read.csv(csv1, header=TRUE, sep=",", row.names = 1)
  gmtkdata2 <- read.csv(csv2, header=TRUE, sep=",", row.names = 1)
  labelpath <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", label_dir, "/overlap-direct/label_map.tab", sep = ""))
  labelmap <- read.csv(labelpath, sep="\t", skip=2, header=FALSE)
  
  # gmtkdata2 <- gmtkdata2[names(gmtkdata1)]
  gmtkdata1 <- gmtkdata1[, order(colnames(gmtkdata1))]
  gmtkdata2 <- gmtkdata2[, order(colnames(gmtkdata2))]
  rownames(gmtkdata1) <- paste("A", rownames(gmtkdata1), sep = "")
  rownames(gmtkdata2) <- paste("B", rownames(gmtkdata2), sep = "")
  ordered.map <- labelmap[order(labelmap$V1), ]
  reorderindex <- (ordered.map$V2 + 1)
  reordered.gmtkdata1 <- gmtkdata1[reorderindex, ]
  gmtkdata1 <- reordered.gmtkdata1
  my_palette <- colorRampPalette(c("mintcream", "lightskyblue", "navyblue"))(n = 299)
  data1 <- data.matrix(gmtkdata1)
  data2 <- data.matrix(gmtkdata2)
  key1 <- capture.output(cat("Run", "1"))
  key2 <- capture.output(cat("Run", "2"))
  ht1 <- Heatmap(data1, name = "Value", cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Trained GMTK Mean Signal A", col = my_palette, row_names_side = "right")
  ht2 <- Heatmap(data2, name = "Value", cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Trained GMTK Mean Signal B", col = my_palette, row_names_side = "left")
  list = ht1 + ht2
  draw(list, gap = unit(1, "cm"), row_title = "Segment Label", row_title_side = "left")
}
# column_title = ""
# column_title_side = "top"
make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq100bp4100bp23")
Heatmap/row annotation names are duplicated: Value

FUNCTION FOR GENERATING HEATMAP TAKING RATIOS OF THE TWO DATA FRAMES FROM EACH OVERLAP.PY STABLE MARRIAGE RUN

#FUNCTION FOR GENERATING HEATMAP TAKING RATIOS OF THE TWO DATA FRAMES
make_ratio_heatmap <- function(csv1, csv2, label_dir, marriage.name){
  library(ComplexHeatmap)
  gmtkdata1 <- read.csv(csv1, header=TRUE, sep=",", row.names = 1)
  gmtkdata2 <- read.csv(csv2, header=TRUE, sep=",", row.names = 1)
  labelpath <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", label_dir, "/overlap-direct/label_map.tab", sep = ""))
  labelmap <- read.csv(labelpath, sep="\t", skip=2, header=FALSE)
  gmtkdata2 <- gmtkdata2[names(gmtkdata1)]
  ordered.map <- labelmap[order(labelmap$V1), ]
  reorderindex <- (ordered.map$V2 + 1)
  reordered.gmtkdata1 <- gmtkdata1[reorderindex, ]
  gmtkdata1 <- reordered.gmtkdata1
  # gmtkdata2 <- gmtkdata2[reorderindex, ]
  my_palette <- colorRampPalette(c("mintcream", "lightskyblue", "navyblue"))(n = 299)
  data1 <- data.matrix(gmtkdata1)
  data2 <- data.matrix(gmtkdata2)
  divide1 <- data1/data2
  # print(divide1)
  divide2 <- data2/data1
  # print(divide2)
  key1 <- capture.output(cat("Run", "1"))
  key2 <- capture.output(cat("Run", "2"))
  ht_list = Heatmap(divide1, name = key1, cluster_rows = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Protein Marks 1 into 2", row_title = "Labels", col = my_palette) +
            Heatmap(divide2, name = key2, cluster_rows = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Protein Marks 2 into 1", row_title = "Labels", col = my_palette)
  draw(ht_list, gap = unit(1, "cm"), column_title = marriage.name, column_title_side = "top")
}
make_ratio_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq100bp4100bp23", "Stable Marriage Test")

FUNCTION FOR BP OVERLAP, AND NORMALIZED REORDERED LABELS HEATMAP BY ROW AND BY COLUMN

#FUNCTION FOR BP OVERLAP, AND NORMALIZED REORDERED LABELS HEATMAP BY ROW AND BY COLUMN
plot_reorder_labels <- function(csv_and_label_dir){
  library(ComplexHeatmap)
  csv_path <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", csv_and_label_dir, "/overlap-direct/overlap.tab", sep = ""))
  labelpath <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", csv_and_label_dir, "/overlap-direct/label_map.tab", sep = ""))
  # csv_path <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", "K5seq100bp4100bp23", "/overlap-direct/overlap.tab", sep = ""))
  # labelpath <- capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", "K5seq100bp4100bp23", "/overlap-direct/label_map.tab", sep = ""))
  
  labelmap <- read.csv(labelpath, sep="\t", skip=2, header=FALSE)
  overlap <- read.csv(csv_path, sep="\t", skip=1, header=TRUE)
  label <- overlap[,1]
  labelA <- paste("A", label, sep="")
  lastcolindex <- ncol(overlap)
  # none <- overlap[,lastcolindex-1]
  overlap <- as.matrix(overlap[,-c(1, lastcolindex)])
  selection <- overlap[,1:ncol(overlap)-1]
  #row normalization gives you a transpose as a result!
  rnormselection <- t(apply(selection, 1, norm <- function(x){return ((x-min(x))/(max(x)-min(x)))}))
  cnormselection <- apply(selection, 2, norm <- function(x){return ((x-min(x))/(max(x)-min(x)))})
  colnames(selection) <- labelA
  # selection <- cbind(selection, none)
  # print(selection)
  colnames(rnormselection) <- labelA
  # rnormselection <- cbind(rnormselection, none)
  # print(rnormselection)
  colnames(cnormselection) <- labelA
  # cnormselection <- cbind(cnormselection, none)
  ordered.map <- labelmap[order(labelmap$V1), ]
  reorderindex <- (ordered.map$V2 + 1)
  reordered.overlap <- selection[reorderindex, ]
  selection <- reordered.overlap
  rnormselection <- rnormselection[reorderindex, ]
  cnormselection <- cnormselection[reorderindex, ]
  rownames(selection) <- paste("B", ordered.map$V2, sep="")
  rownames(rnormselection) <- paste("B", ordered.map$V2, sep="")
  rownames(cnormselection) <- paste("B", ordered.map$V2, sep="")
  my_palette <- colorRampPalette(c("mintcream", "lightskyblue", "navyblue"))(n = 299)
 htlist = Heatmap(selection, name = "Value", cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "BP Overlap of Labels Only", row_title = "Labels Set A vs B", col = my_palette) +
            Heatmap(cnormselection, name =  "Value Norm", cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Column Normalized", row_title = "Labels Set A vs B", col = my_palette) +
            Heatmap(rnormselection, name = "Value Norm", cluster_rows = FALSE, cluster_columns = FALSE,show_row_dend = FALSE, show_column_dend = FALSE, column_title = "Row Normalized", row_title = "Labels Set A vs B", col = my_palette)
  draw(htlist, gap = unit(1, "cm"), column_title = "", column_title_side = "top")
}
plot_reorder_labels("K5seq100bp4100bp23")

BIPARTITE GRAPH WITH THRESHOLD CUT-OFFS FOR ARROWS

#BIPARTITE GRAPH WITH THRESHOLD CUT-OFFS FOR ARROWS
load.data <- function(overlap.dir, threshold.value) {
  overlap <- read.csv(capture.output(cat("/scratch/mordor/hoffmangroup/wxu/data/2018-06-19_Segway_Analysis/", overlap.dir, "/overlap-direct/overlap.tab", sep = "")), sep="\t", skip=1, header=TRUE)
  lastcolindex <- ncol(overlap)
  #grab sum of last column
  total <- sum(as.numeric(overlap$total))
  #get only the columns that are not labels, none, and total
  overlap <- as.matrix(overlap[,-c(1, lastcolindex-1, lastcolindex)])
  #normalize the matrix
  norm_overlap <- apply(overlap, 2, norm <- function(x){return (x/total)})
  #get the row, column indexes respectively
  edge <- as.data.frame(which(norm_overlap>as.numeric(threshold.value), arr.in = TRUE))
  #subtract one from the indices to get the apt label
  edge <- edge -1
  return(edge)
}

get_bipartite <- function(edge){
  require(igraph)                                                                  
  require(gtools)                                                   

  edge[,1] <- paste("B", edge[,1], sep="")
  edge[,2] <- paste("A", edge[,2], sep="")
                                                                                   
  # Order the vertices (which are mixed strings)                                  
  ordered.vertices <- unique(c(mixedsort(edge[,1]), mixedsort(edge[,2])))              
                                                                                   
  # Setup graph                                                                    
  bidata2 <- graph.data.frame(edge, vertices = ordered.vertices, directed = FALSE)
  # print(bidata2)
  V(bidata2)$type <- bipartite_mapping(bidata2)$type                              
  V(bidata2)$label.color <- "black"                                                
  V(bidata2)$color <- ifelse(V(bidata2)$type, "lightblue", "salmon")              
  V(bidata2)$shape <- ifelse(V(bidata2)$type, "circle", "square")                  
  E(bidata2)$color <- "lightgray"                                                  
  V(bidata2)$label.cex <- 1                                                        
  V(bidata2)$frame.color <-  "gray"                                                
  V(bidata2)$size <- 18                                                            
                                                                                   
  # Reorder layout    
  # Add -1 for the 2nd column sort, so that it is in descending instead of ascending order (so 1-> 0); then we get x-axis to y-axis label readings
  l <- layout.bipartite(bidata2)
  # sort the bipartite mapping by the 2nd column first, then the first. Negate all values, then sort in asending so -1 -> -9
  l <- l[order(-l[,2], -l[,1]),]
  # to get a horizontal mapping                                                    
  bd2 <- plot(bidata2, layout = l[, c(2,1)])                                      
  return(bd2)                                                                      
}

# edge <- load.data("K5seq100bp4100bp23", 0.02)
# edge
get_bipartite(load.data("K5seq100bp4100bp23", 0.025))

K562 ChIP-exo 100 bp vs 1 bp Rand Seed 4

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-05-30_Segway_Run_2/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-05-30_Segway_Run_2/gmtk_parameters2/gmtk_parameters.stats.csv", "K5ex100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex100bp1bp", 0.015))
NULL

K562 ChIP-exo 1 bp vs 2 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters8/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters4/gmtk_parameters.stats.csv", "K5ex1bp2bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex1bp2bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex1bp2bp", 0.015))
NULL

#![length distribution](/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/length_distribution8/length_distibution.slide.png)

K562 ChIP-exo 1bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters8/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters4/gmtk_parameters.stats.csv", "K5ex1bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex1bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex1bp50bp", 0.025))
NULL

K562 ChIP-exo 100bp vs 1 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters7/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters8/gmtk_parameters.stats.csv", "K5ex23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex23rand100bp1bp", 0.022))
NULL

K562 ChIP-exo 2bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters7/gmtk_parameters.stats.csv", "K5ex2bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex2bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex2bp100bp", 0.015))
NULL

K562 ChIP-exo 2bp vs 30 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters4/gmtk_parameters.stats.csv", "K5ex2bp30bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex2bp30bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex2bp30bp", 0.02))
NULL

K562 ChIP-exo 2bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters4/gmtk_parameters.stats.csv", "K5ex2bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex2bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex2bp50bp", 0.015))
NULL

K562 ChIP-exo 30bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters7/gmtk_parameters.stats.csv", "K5ex30bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex30bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex30bp100bp", 0.02))
NULL

K562 ChIP-exo 30 bp vs 1 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters8/gmtk_parameters.stats.csv", "K5ex30bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex30bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex30bp1bp", 0.025))
NULL

K562 ChIP-exo 30bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters4/gmtk_parameters.stats.csv", "K5ex30bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex30bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex30bp50bp", 0.02))
NULL

K562 ChIP-exo 50bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters7/gmtk_parameters.stats.csv", "K5ex50bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5ex50bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5ex50bp100bp", 0.02))
NULL

K562 ChIP-seq 100bp vs 1 bp Rand Seed 4

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters2/gmtk_parameters.stats.csv", "K5seq100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq100bp1bp", 0.02))
NULL

K562 ChIP-seq 1bp vs 2bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq1bp2bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq1bp2bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq1bp2bp", 0.025))
NULL

K562 ChIP-seq 1bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq1bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq1bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq1bp50bp", 0.035))
NULL

K562 ChIP-seq 100bp vs 1 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters2/gmtk_parameters.stats.csv", "K5seq23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq23rand100bp1bp", 0.03))
NULL

K562 ChIP-seq 2bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq2bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq2bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq2bp100bp", 0.03))
NULL

K562 ChIP-seq 2bp vs 30 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq2bp30bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq2bp30bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq2bp30bp", 0.03))
NULL

K562 ChIP-seq 2bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq2bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq2bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq2bp50bp", 0.03))
NULL

K562 ChIP-seq 30bp vs 100bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq30bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq30bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq30bp100bp", 0.04))
NULL

K562 ChIP-seq 30bp vs 1bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters2/gmtk_parameters.stats.csv", "K5seq30bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq30bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq30bp1bp", 0.03))
NULL

K562 ChIP-seq 30 bp cs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq30bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq30bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq30bp50bp", 0.04))
NULL

K562 ChIP-seq 50bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters/gmtk_parameters.stats.csv", "K5seq50bp1000bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("K5seq50bp1000bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("K5seq50bp1000bp", 0.04))
NULL

MCF7 ChIP-exo 100 bp vs 1bp Rand Seed 4

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters5/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters6/gmtk_parameters.stats.csv", "MCex100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex100bp1bp", 0.02))
NULL

MCF7 -exo 1bp vs 50 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters6/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters3/gmtk_parameters.stats.csv", "MCex1bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex1bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex1bp50bp", 0.03))
NULL

MCF7 exo 100 bp vs 1 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters5/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters6/gmtk_parameters.stats.csv", "MCex23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex23rand100bp1bp", 0.03))
NULL

MCF7 exo 2bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters5/gmtk_parameters.stats.csv", "MCex2bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex2bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex2bp100bp", 0.03))
NULL

MCF7 exo 2bp vs 30 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters3/gmtk_parameters.stats.csv", "MCex2bp30bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex2bp30bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex2bp30bp", 0.03))
NULL

MCF7 ChIP-exo 2 bp vs 50 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters3/gmtk_parameters.stats.csv", "MCex2bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex2bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex2bp50bp", 0.04))
NULL

MCF7 exo 30 bp vs 100 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters5/gmtk_parameters.stats.csv", "MCex30bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex30bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex30bp100bp", 0.03))
NULL

MCF7 exo 30 bp vs 1 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters6/gmtk_parameters.stats.csv", "MCex30bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex30bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex30bp1bp", 0.025))
NULL

MCF7 exo 30bp vs 50 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters3/gmtk_parameters.stats.csv", "MCex30bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex30bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex30bp50bp", 0.04))
NULL

MCF7 exo 50 bp vs 100 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters5/gmtk_parameters.stats.csv", "MCex50bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCex50bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCex50bp100bp", 0.03))
NULL

MCF7 exo 1bp vs 2bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters6/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters3/gmtk_parameters.stats.csv", "MCFex1bp2bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCFex1bp2bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCFex1bp2bp", 0.03))
NULL

MCF7seq 100 bp vs 1 bp Rand Seed 4

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-01_Segway_Run_3/gmtk_parameters4/gmtk_parameters.stats.csv", "MCseq100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq100bp1bp", 0.03))
NULL

MCF7seq 1bp vs 2bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters2/gmtk_parameters.stats.csv", "MCseq1bp2bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq1bp2bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq1bp2bp", 0.03))
NULL

MCF7 ChIP-seq 1 bp vs 50 bp

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters4/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters2/gmtk_parameters.stats.csv", "MCseq1bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq1bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq1bp50bp", 0.03))
NULL

MCF7 ChIP-seq 100bp vs 1 bp Rand Seed 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters3/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters4/gmtk_parameters.stats.csv", "MCseq23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq23rand100bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq23rand100bp1bp", 0.03))
NULL

MCF7 ChIP-seq 2bp vs 100 bp

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters3/gmtk_parameters.stats.csv", "MCseq2bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq2bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq2bp100bp", 0.03))
NULL

MCF7 ChIP-seq 2 bp vs 30 bp

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters2/gmtk_parameters.stats.csv", "MCseq2bp30bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq2bp30bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq2bp30bp", 0.04))
NULL

MCF7 ChIP-seq 2 bp vs 50 bp

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-28_Segway_Run_7_Res2/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters2/gmtk_parameters.stats.csv", "MCseq2bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq2bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq2bp50bp", 0.05))
NULL

MCF7 ChIP-seq 30 bp vs 100 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters3/gmtk_parameters.stats.csv", "MCseq30bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq30bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq30bp100bp", 0.05))
NULL

MCF7 ChIP-seq 30 bp vs 1 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters4/gmtk_parameters.stats.csv", "MCseq30bp1bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq30bp1bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq30bp1bp", 0.05))
NULL

MCF7 ChIP-seq 30 bp vs 50 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-21_Segway_Run_5_Res30/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters2/gmtk_parameters.stats.csv", "MCseq30bp50bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq30bp50bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq30bp50bp", 0.05))
NULL

MCF7 ChIP-seq 50 bp vs 100 bp Rand 23

make_raw_heatmap("/scratch/mordor/hoffmangroup/wxu/data/2018-06-26_Segway_Run_6_Res50/gmtk_parameters2/gmtk_parameters.stats.csv", "/scratch/mordor/hoffmangroup/wxu/data/2018-06-06_Segway_Run_4/gmtk_parameters3/gmtk_parameters.stats.csv", "MCseq50bp100bp")
Heatmap/row annotation names are duplicated: Value

plot_reorder_labels("MCseq50bp100bp")
Heatmap/row annotation names are duplicated: Value Norm

get_bipartite(load.data("MCseq50bp100bp", 0.04))
NULL

rmarkdown::render(MarriagebtResolutionsFinal.Rmd)

LS0tCnRpdGxlOiAiU3RhYmxlIE1hcnJpYWdlIEJldHdlZW4gMS8yLzMwLzUwLzEwMCBicCBSZXNvbHV0aW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIEZVTkNUSU9OIEZPUiBDUkVBVElORyBTRUdNRU5UIExBQkVMUyBWUyBQUk9URUlOUyBIRUFUTUFQIFVTSU5HIEdNVEsgUEFSQU1FVEVSUyBPVVRQVVQKYGBge3J9CiNGVU5DVElPTiBGT1IgQ1JFQVRJTkcgTEFCRUxTIFZTIFBST1RFSU5TIEhFQVRNQVAKI2FyZ3MgY3N2MSwgY3N2MiwgbGFiZWxfbWFwLCBtdXN0IGJlIGluIHF1b3RhdGlvbnMgKGFuZCBwcmVmZXJhYmx5IGZ1bGwgcGF0aHMpIHdoZW4gcGFzc2VkIGluCiNsYWJlbF9tYXAgY2FuIGp1c3QgYmUgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBmb3IgaXQncyBwYXJ0aWN1bGFyIHN0YWJsZSBtYXJyaWFnZSBydW4KbWFrZV9yYXdfaGVhdG1hcCA8LSBmdW5jdGlvbihjc3YxLCBjc3YyLCBsYWJlbF9kaXIpewogIGxpYnJhcnkoQ29tcGxleEhlYXRtYXApCiAgZ210a2RhdGExIDwtIHJlYWQuY3N2KGNzdjEsIGhlYWRlcj1UUlVFLCBzZXA9IiwiLCByb3cubmFtZXMgPSAxKQogIGdtdGtkYXRhMiA8LSByZWFkLmNzdihjc3YyLCBoZWFkZXI9VFJVRSwgc2VwPSIsIiwgcm93Lm5hbWVzID0gMSkKICBsYWJlbHBhdGggPC0gY2FwdHVyZS5vdXRwdXQoY2F0KCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMTlfU2Vnd2F5X0FuYWx5c2lzLyIsIGxhYmVsX2RpciwgIi9vdmVybGFwLWRpcmVjdC9sYWJlbF9tYXAudGFiIiwgc2VwID0gIiIpKQogIGxhYmVsbWFwIDwtIHJlYWQuY3N2KGxhYmVscGF0aCwgc2VwPSJcdCIsIHNraXA9MiwgaGVhZGVyPUZBTFNFKQogIAogICMgZ210a2RhdGEyIDwtIGdtdGtkYXRhMltuYW1lcyhnbXRrZGF0YTEpXQogIGdtdGtkYXRhMSA8LSBnbXRrZGF0YTFbLCBvcmRlcihjb2xuYW1lcyhnbXRrZGF0YTEpKV0KICBnbXRrZGF0YTIgPC0gZ210a2RhdGEyWywgb3JkZXIoY29sbmFtZXMoZ210a2RhdGEyKSldCiAgcm93bmFtZXMoZ210a2RhdGExKSA8LSBwYXN0ZSgiQSIsIHJvd25hbWVzKGdtdGtkYXRhMSksIHNlcCA9ICIiKQogIHJvd25hbWVzKGdtdGtkYXRhMikgPC0gcGFzdGUoIkIiLCByb3duYW1lcyhnbXRrZGF0YTIpLCBzZXAgPSAiIikKICBvcmRlcmVkLm1hcCA8LSBsYWJlbG1hcFtvcmRlcihsYWJlbG1hcCRWMSksIF0KICByZW9yZGVyaW5kZXggPC0gKG9yZGVyZWQubWFwJFYyICsgMSkKICByZW9yZGVyZWQuZ210a2RhdGExIDwtIGdtdGtkYXRhMVtyZW9yZGVyaW5kZXgsIF0KICBnbXRrZGF0YTEgPC0gcmVvcmRlcmVkLmdtdGtkYXRhMQogIG15X3BhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJtaW50Y3JlYW0iLCAibGlnaHRza3libHVlIiwgIm5hdnlibHVlIikpKG4gPSAyOTkpCiAgZGF0YTEgPC0gZGF0YS5tYXRyaXgoZ210a2RhdGExKQogIGRhdGEyIDwtIGRhdGEubWF0cml4KGdtdGtkYXRhMikKICBrZXkxIDwtIGNhcHR1cmUub3V0cHV0KGNhdCgiUnVuIiwgIjEiKSkKICBrZXkyIDwtIGNhcHR1cmUub3V0cHV0KGNhdCgiUnVuIiwgIjIiKSkKICBodDEgPC0gSGVhdG1hcChkYXRhMSwgbmFtZSA9ICJWYWx1ZSIsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgc2hvd19yb3dfZGVuZCA9IEZBTFNFLCBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsIGNvbHVtbl90aXRsZSA9ICJUcmFpbmVkIEdNVEsgTWVhbiBTaWduYWwgQSIsIGNvbCA9IG15X3BhbGV0dGUsIHJvd19uYW1lc19zaWRlID0gInJpZ2h0IikKICBodDIgPC0gSGVhdG1hcChkYXRhMiwgbmFtZSA9ICJWYWx1ZSIsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwgc2hvd19yb3dfZGVuZCA9IEZBTFNFLCBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsIGNvbHVtbl90aXRsZSA9ICJUcmFpbmVkIEdNVEsgTWVhbiBTaWduYWwgQiIsIGNvbCA9IG15X3BhbGV0dGUsIHJvd19uYW1lc19zaWRlID0gImxlZnQiKQogIGxpc3QgPSBodDEgKyBodDIKICBkcmF3KGxpc3QsIGdhcCA9IHVuaXQoMSwgImNtIiksIHJvd190aXRsZSA9ICJTZWdtZW50IExhYmVsIiwgcm93X3RpdGxlX3NpZGUgPSAibGVmdCIpCn0KIyBjb2x1bW5fdGl0bGUgPSAiIgojIGNvbHVtbl90aXRsZV9zaWRlID0gInRvcCIKbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTAxX1NlZ3dheV9SdW5fMy9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1c2VxMTAwYnA0MTAwYnAyMyIpCmBgYAoKIyBGVU5DVElPTiBGT1IgR0VORVJBVElORyBIRUFUTUFQIFRBS0lORyBSQVRJT1MgT0YgVEhFIFRXTyBEQVRBIEZSQU1FUyBGUk9NIEVBQ0ggT1ZFUkxBUC5QWSBTVEFCTEUgTUFSUklBR0UgUlVOCmBgYHtyfQojRlVOQ1RJT04gRk9SIEdFTkVSQVRJTkcgSEVBVE1BUCBUQUtJTkcgUkFUSU9TIE9GIFRIRSBUV08gREFUQSBGUkFNRVMKbWFrZV9yYXRpb19oZWF0bWFwIDwtIGZ1bmN0aW9uKGNzdjEsIGNzdjIsIGxhYmVsX2RpciwgbWFycmlhZ2UubmFtZSl7CiAgbGlicmFyeShDb21wbGV4SGVhdG1hcCkKICBnbXRrZGF0YTEgPC0gcmVhZC5jc3YoY3N2MSwgaGVhZGVyPVRSVUUsIHNlcD0iLCIsIHJvdy5uYW1lcyA9IDEpCiAgZ210a2RhdGEyIDwtIHJlYWQuY3N2KGNzdjIsIGhlYWRlcj1UUlVFLCBzZXA9IiwiLCByb3cubmFtZXMgPSAxKQogIGxhYmVscGF0aCA8LSBjYXB0dXJlLm91dHB1dChjYXQoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0xOV9TZWd3YXlfQW5hbHlzaXMvIiwgbGFiZWxfZGlyLCAiL292ZXJsYXAtZGlyZWN0L2xhYmVsX21hcC50YWIiLCBzZXAgPSAiIikpCiAgbGFiZWxtYXAgPC0gcmVhZC5jc3YobGFiZWxwYXRoLCBzZXA9Ilx0Iiwgc2tpcD0yLCBoZWFkZXI9RkFMU0UpCiAgZ210a2RhdGEyIDwtIGdtdGtkYXRhMltuYW1lcyhnbXRrZGF0YTEpXQogIG9yZGVyZWQubWFwIDwtIGxhYmVsbWFwW29yZGVyKGxhYmVsbWFwJFYxKSwgXQogIHJlb3JkZXJpbmRleCA8LSAob3JkZXJlZC5tYXAkVjIgKyAxKQogIHJlb3JkZXJlZC5nbXRrZGF0YTEgPC0gZ210a2RhdGExW3Jlb3JkZXJpbmRleCwgXQogIGdtdGtkYXRhMSA8LSByZW9yZGVyZWQuZ210a2RhdGExCiAgIyBnbXRrZGF0YTIgPC0gZ210a2RhdGEyW3Jlb3JkZXJpbmRleCwgXQogIG15X3BhbGV0dGUgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJtaW50Y3JlYW0iLCAibGlnaHRza3libHVlIiwgIm5hdnlibHVlIikpKG4gPSAyOTkpCiAgZGF0YTEgPC0gZGF0YS5tYXRyaXgoZ210a2RhdGExKQogIGRhdGEyIDwtIGRhdGEubWF0cml4KGdtdGtkYXRhMikKICBkaXZpZGUxIDwtIGRhdGExL2RhdGEyCiAgIyBwcmludChkaXZpZGUxKQogIGRpdmlkZTIgPC0gZGF0YTIvZGF0YTEKICAjIHByaW50KGRpdmlkZTIpCiAga2V5MSA8LSBjYXB0dXJlLm91dHB1dChjYXQoIlJ1biIsICIxIikpCiAga2V5MiA8LSBjYXB0dXJlLm91dHB1dChjYXQoIlJ1biIsICIyIikpCiAgaHRfbGlzdCA9IEhlYXRtYXAoZGl2aWRlMSwgbmFtZSA9IGtleTEsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBzaG93X3Jvd19kZW5kID0gRkFMU0UsIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIlByb3RlaW4gTWFya3MgMSBpbnRvIDIiLCByb3dfdGl0bGUgPSAiTGFiZWxzIiwgY29sID0gbXlfcGFsZXR0ZSkgKwogICAgICAgICAgICBIZWF0bWFwKGRpdmlkZTIsIG5hbWUgPSBrZXkyLCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgc2hvd19yb3dfZGVuZCA9IEZBTFNFLCBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsIGNvbHVtbl90aXRsZSA9ICJQcm90ZWluIE1hcmtzIDIgaW50byAxIiwgcm93X3RpdGxlID0gIkxhYmVscyIsIGNvbCA9IG15X3BhbGV0dGUpCiAgZHJhdyhodF9saXN0LCBnYXAgPSB1bml0KDEsICJjbSIpLCBjb2x1bW5fdGl0bGUgPSBtYXJyaWFnZS5uYW1lLCBjb2x1bW5fdGl0bGVfc2lkZSA9ICJ0b3AiKQp9Cm1ha2VfcmF0aW9faGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTAxX1NlZ3dheV9SdW5fMy9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1c2VxMTAwYnA0MTAwYnAyMyIsICJTdGFibGUgTWFycmlhZ2UgVGVzdCIpCmBgYAoKIyBGVU5DVElPTiBGT1IgQlAgT1ZFUkxBUCwgQU5EIE5PUk1BTElaRUQgUkVPUkRFUkVEIExBQkVMUyBIRUFUTUFQIEJZIFJPVyBBTkQgQlkgQ09MVU1OCmBgYHtyfQojRlVOQ1RJT04gRk9SIEJQIE9WRVJMQVAsIEFORCBOT1JNQUxJWkVEIFJFT1JERVJFRCBMQUJFTFMgSEVBVE1BUCBCWSBST1cgQU5EIEJZIENPTFVNTgpwbG90X3Jlb3JkZXJfbGFiZWxzIDwtIGZ1bmN0aW9uKGNzdl9hbmRfbGFiZWxfZGlyKXsKICBsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQogIGNzdl9wYXRoIDwtIGNhcHR1cmUub3V0cHV0KGNhdCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTE5X1NlZ3dheV9BbmFseXNpcy8iLCBjc3ZfYW5kX2xhYmVsX2RpciwgIi9vdmVybGFwLWRpcmVjdC9vdmVybGFwLnRhYiIsIHNlcCA9ICIiKSkKICBsYWJlbHBhdGggPC0gY2FwdHVyZS5vdXRwdXQoY2F0KCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMTlfU2Vnd2F5X0FuYWx5c2lzLyIsIGNzdl9hbmRfbGFiZWxfZGlyLCAiL292ZXJsYXAtZGlyZWN0L2xhYmVsX21hcC50YWIiLCBzZXAgPSAiIikpCiAgIyBjc3ZfcGF0aCA8LSBjYXB0dXJlLm91dHB1dChjYXQoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0xOV9TZWd3YXlfQW5hbHlzaXMvIiwgIks1c2VxMTAwYnA0MTAwYnAyMyIsICIvb3ZlcmxhcC1kaXJlY3Qvb3ZlcmxhcC50YWIiLCBzZXAgPSAiIikpCiAgIyBsYWJlbHBhdGggPC0gY2FwdHVyZS5vdXRwdXQoY2F0KCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMTlfU2Vnd2F5X0FuYWx5c2lzLyIsICJLNXNlcTEwMGJwNDEwMGJwMjMiLCAiL292ZXJsYXAtZGlyZWN0L2xhYmVsX21hcC50YWIiLCBzZXAgPSAiIikpCiAgCiAgbGFiZWxtYXAgPC0gcmVhZC5jc3YobGFiZWxwYXRoLCBzZXA9Ilx0Iiwgc2tpcD0yLCBoZWFkZXI9RkFMU0UpCiAgb3ZlcmxhcCA8LSByZWFkLmNzdihjc3ZfcGF0aCwgc2VwPSJcdCIsIHNraXA9MSwgaGVhZGVyPVRSVUUpCiAgbGFiZWwgPC0gb3ZlcmxhcFssMV0KICBsYWJlbEEgPC0gcGFzdGUoIkEiLCBsYWJlbCwgc2VwPSIiKQogIGxhc3Rjb2xpbmRleCA8LSBuY29sKG92ZXJsYXApCiAgIyBub25lIDwtIG92ZXJsYXBbLGxhc3Rjb2xpbmRleC0xXQogIG92ZXJsYXAgPC0gYXMubWF0cml4KG92ZXJsYXBbLC1jKDEsIGxhc3Rjb2xpbmRleCldKQogIHNlbGVjdGlvbiA8LSBvdmVybGFwWywxOm5jb2wob3ZlcmxhcCktMV0KICAjcm93IG5vcm1hbGl6YXRpb24gZ2l2ZXMgeW91IGEgdHJhbnNwb3NlIGFzIGEgcmVzdWx0IQogIHJub3Jtc2VsZWN0aW9uIDwtIHQoYXBwbHkoc2VsZWN0aW9uLCAxLCBub3JtIDwtIGZ1bmN0aW9uKHgpe3JldHVybiAoKHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSkpfSkpCiAgY25vcm1zZWxlY3Rpb24gPC0gYXBwbHkoc2VsZWN0aW9uLCAyLCBub3JtIDwtIGZ1bmN0aW9uKHgpe3JldHVybiAoKHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSkpfSkKICBjb2xuYW1lcyhzZWxlY3Rpb24pIDwtIGxhYmVsQQogICMgc2VsZWN0aW9uIDwtIGNiaW5kKHNlbGVjdGlvbiwgbm9uZSkKICAjIHByaW50KHNlbGVjdGlvbikKICBjb2xuYW1lcyhybm9ybXNlbGVjdGlvbikgPC0gbGFiZWxBCiAgIyBybm9ybXNlbGVjdGlvbiA8LSBjYmluZChybm9ybXNlbGVjdGlvbiwgbm9uZSkKICAjIHByaW50KHJub3Jtc2VsZWN0aW9uKQogIGNvbG5hbWVzKGNub3Jtc2VsZWN0aW9uKSA8LSBsYWJlbEEKICAjIGNub3Jtc2VsZWN0aW9uIDwtIGNiaW5kKGNub3Jtc2VsZWN0aW9uLCBub25lKQogIG9yZGVyZWQubWFwIDwtIGxhYmVsbWFwW29yZGVyKGxhYmVsbWFwJFYxKSwgXQogIHJlb3JkZXJpbmRleCA8LSAob3JkZXJlZC5tYXAkVjIgKyAxKQogIHJlb3JkZXJlZC5vdmVybGFwIDwtIHNlbGVjdGlvbltyZW9yZGVyaW5kZXgsIF0KICBzZWxlY3Rpb24gPC0gcmVvcmRlcmVkLm92ZXJsYXAKICBybm9ybXNlbGVjdGlvbiA8LSBybm9ybXNlbGVjdGlvbltyZW9yZGVyaW5kZXgsIF0KICBjbm9ybXNlbGVjdGlvbiA8LSBjbm9ybXNlbGVjdGlvbltyZW9yZGVyaW5kZXgsIF0KICByb3duYW1lcyhzZWxlY3Rpb24pIDwtIHBhc3RlKCJCIiwgb3JkZXJlZC5tYXAkVjIsIHNlcD0iIikKICByb3duYW1lcyhybm9ybXNlbGVjdGlvbikgPC0gcGFzdGUoIkIiLCBvcmRlcmVkLm1hcCRWMiwgc2VwPSIiKQogIHJvd25hbWVzKGNub3Jtc2VsZWN0aW9uKSA8LSBwYXN0ZSgiQiIsIG9yZGVyZWQubWFwJFYyLCBzZXA9IiIpCiAgbXlfcGFsZXR0ZSA8LSBjb2xvclJhbXBQYWxldHRlKGMoIm1pbnRjcmVhbSIsICJsaWdodHNreWJsdWUiLCAibmF2eWJsdWUiKSkobiA9IDI5OSkKIGh0bGlzdCA9IEhlYXRtYXAoc2VsZWN0aW9uLCBuYW1lID0gIlZhbHVlIiwgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLCBzaG93X3Jvd19kZW5kID0gRkFMU0UsIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIkJQIE92ZXJsYXAgb2YgTGFiZWxzIE9ubHkiLCByb3dfdGl0bGUgPSAiTGFiZWxzIFNldCBBIHZzIEIiLCBjb2wgPSBteV9wYWxldHRlKSArCiAgICAgICAgICAgIEhlYXRtYXAoY25vcm1zZWxlY3Rpb24sIG5hbWUgPSAgIlZhbHVlIE5vcm0iLCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsIHNob3dfcm93X2RlbmQgPSBGQUxTRSwgc2hvd19jb2x1bW5fZGVuZCA9IEZBTFNFLCBjb2x1bW5fdGl0bGUgPSAiQ29sdW1uIE5vcm1hbGl6ZWQiLCByb3dfdGl0bGUgPSAiTGFiZWxzIFNldCBBIHZzIEIiLCBjb2wgPSBteV9wYWxldHRlKSArCiAgICAgICAgICAgIEhlYXRtYXAocm5vcm1zZWxlY3Rpb24sIG5hbWUgPSAiVmFsdWUgTm9ybSIsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSxzaG93X3Jvd19kZW5kID0gRkFMU0UsIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIlJvdyBOb3JtYWxpemVkIiwgcm93X3RpdGxlID0gIkxhYmVscyBTZXQgQSB2cyBCIiwgY29sID0gbXlfcGFsZXR0ZSkKICBkcmF3KGh0bGlzdCwgZ2FwID0gdW5pdCgxLCAiY20iKSwgY29sdW1uX3RpdGxlID0gIiIsIGNvbHVtbl90aXRsZV9zaWRlID0gInRvcCIpCn0KcGxvdF9yZW9yZGVyX2xhYmVscygiSzVzZXExMDBicDQxMDBicDIzIikKYGBgCgojIEJJUEFSVElURSBHUkFQSCBXSVRIIFRIUkVTSE9MRCBDVVQtT0ZGUyBGT1IgQVJST1dTCmBgYHtyfQojQklQQVJUSVRFIEdSQVBIIFdJVEggVEhSRVNIT0xEIENVVC1PRkZTIEZPUiBBUlJPV1MKbG9hZC5kYXRhIDwtIGZ1bmN0aW9uKG92ZXJsYXAuZGlyLCB0aHJlc2hvbGQudmFsdWUpIHsKICBvdmVybGFwIDwtIHJlYWQuY3N2KGNhcHR1cmUub3V0cHV0KGNhdCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTE5X1NlZ3dheV9BbmFseXNpcy8iLCBvdmVybGFwLmRpciwgIi9vdmVybGFwLWRpcmVjdC9vdmVybGFwLnRhYiIsIHNlcCA9ICIiKSksIHNlcD0iXHQiLCBza2lwPTEsIGhlYWRlcj1UUlVFKQogIGxhc3Rjb2xpbmRleCA8LSBuY29sKG92ZXJsYXApCiAgI2dyYWIgc3VtIG9mIGxhc3QgY29sdW1uCiAgdG90YWwgPC0gc3VtKGFzLm51bWVyaWMob3ZlcmxhcCR0b3RhbCkpCiAgI2dldCBvbmx5IHRoZSBjb2x1bW5zIHRoYXQgYXJlIG5vdCBsYWJlbHMsIG5vbmUsIGFuZCB0b3RhbAogIG92ZXJsYXAgPC0gYXMubWF0cml4KG92ZXJsYXBbLC1jKDEsIGxhc3Rjb2xpbmRleC0xLCBsYXN0Y29saW5kZXgpXSkKICAjbm9ybWFsaXplIHRoZSBtYXRyaXgKICBub3JtX292ZXJsYXAgPC0gYXBwbHkob3ZlcmxhcCwgMiwgbm9ybSA8LSBmdW5jdGlvbih4KXtyZXR1cm4gKHgvdG90YWwpfSkKICAjZ2V0IHRoZSByb3csIGNvbHVtbiBpbmRleGVzIHJlc3BlY3RpdmVseQogIGVkZ2UgPC0gYXMuZGF0YS5mcmFtZSh3aGljaChub3JtX292ZXJsYXA+YXMubnVtZXJpYyh0aHJlc2hvbGQudmFsdWUpLCBhcnIuaW4gPSBUUlVFKSkKICAjc3VidHJhY3Qgb25lIGZyb20gdGhlIGluZGljZXMgdG8gZ2V0IHRoZSBhcHQgbGFiZWwKICBlZGdlIDwtIGVkZ2UgLTEKICByZXR1cm4oZWRnZSkKfQoKZ2V0X2JpcGFydGl0ZSA8LSBmdW5jdGlvbihlZGdlKXsKICByZXF1aXJlKGlncmFwaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICByZXF1aXJlKGd0b29scykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgZWRnZVssMV0gPC0gcGFzdGUoIkIiLCBlZGdlWywxXSwgc2VwPSIiKQogIGVkZ2VbLDJdIDwtIHBhc3RlKCJBIiwgZWRnZVssMl0sIHNlcD0iIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAjIE9yZGVyIHRoZSB2ZXJ0aWNlcyAod2hpY2ggYXJlIG1peGVkIHN0cmluZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIG9yZGVyZWQudmVydGljZXMgPC0gdW5pcXVlKGMobWl4ZWRzb3J0KGVkZ2VbLDFdKSwgbWl4ZWRzb3J0KGVkZ2VbLDJdKSkpICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAjIFNldHVwIGdyYXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBiaWRhdGEyIDwtIGdyYXBoLmRhdGEuZnJhbWUoZWRnZSwgdmVydGljZXMgPSBvcmRlcmVkLnZlcnRpY2VzLCBkaXJlY3RlZCA9IEZBTFNFKQogICMgcHJpbnQoYmlkYXRhMikKICBWKGJpZGF0YTIpJHR5cGUgPC0gYmlwYXJ0aXRlX21hcHBpbmcoYmlkYXRhMikkdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFYoYmlkYXRhMikkbGFiZWwuY29sb3IgPC0gImJsYWNrIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFYoYmlkYXRhMikkY29sb3IgPC0gaWZlbHNlKFYoYmlkYXRhMikkdHlwZSwgImxpZ2h0Ymx1ZSIsICJzYWxtb24iKSAgICAgICAgICAgICAgCiAgVihiaWRhdGEyKSRzaGFwZSA8LSBpZmVsc2UoVihiaWRhdGEyKSR0eXBlLCAiY2lyY2xlIiwgInNxdWFyZSIpICAgICAgICAgICAgICAgICAgCiAgRShiaWRhdGEyKSRjb2xvciA8LSAibGlnaHRncmF5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgVihiaWRhdGEyKSRsYWJlbC5jZXggPC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgVihiaWRhdGEyKSRmcmFtZS5jb2xvciA8LSAgImdyYXkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgVihiaWRhdGEyKSRzaXplIDwtIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgIyBSZW9yZGVyIGxheW91dCAgICAKICAjIEFkZCAtMSBmb3IgdGhlIDJuZCBjb2x1bW4gc29ydCwgc28gdGhhdCBpdCBpcyBpbiBkZXNjZW5kaW5nIGluc3RlYWQgb2YgYXNjZW5kaW5nIG9yZGVyIChzbyAxLT4gMCk7IHRoZW4gd2UgZ2V0IHgtYXhpcyB0byB5LWF4aXMgbGFiZWwgcmVhZGluZ3MKICBsIDwtIGxheW91dC5iaXBhcnRpdGUoYmlkYXRhMikKICAjIHNvcnQgdGhlIGJpcGFydGl0ZSBtYXBwaW5nIGJ5IHRoZSAybmQgY29sdW1uIGZpcnN0LCB0aGVuIHRoZSBmaXJzdC4gTmVnYXRlIGFsbCB2YWx1ZXMsIHRoZW4gc29ydCBpbiBhc2VuZGluZyBzbyAtMSAtPiAtOQogIGwgPC0gbFtvcmRlcigtbFssMl0sIC1sWywxXSksXQogICMgdG8gZ2V0IGEgaG9yaXpvbnRhbCBtYXBwaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGJkMiA8LSBwbG90KGJpZGF0YTIsIGxheW91dCA9IGxbLCBjKDIsMSldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgcmV0dXJuKGJkMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCn0KCiMgZWRnZSA8LSBsb2FkLmRhdGEoIks1c2VxMTAwYnA0MTAwYnAyMyIsIDAuMDIpCiMgZWRnZQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXExMDBicDQxMDBicDIzIiwgMC4wMjUpKQpgYGAKCiMgSzU2MiBDaElQLWV4byAxMDAgYnAgdnMgMSBicCBSYW5kIFNlZWQgNApgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA1LTMwX1NlZ3dheV9SdW5fMi9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDUtMzBfU2Vnd2F5X1J1bl8yL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNWV4MTAwYnAxYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNWV4MTAwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVleDEwMGJwMWJwIiwgMC4wMTUpKQpgYGAKIyBLNTYyIENoSVAtZXhvIDEgYnAgdnMgMiBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzOC9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yOF9TZWd3YXlfUnVuXzdfUmVzMi9nbXRrX3BhcmFtZXRlcnM0L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVleDFicDJicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1ZXgxYnAyYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVleDFicDJicCIsIDAuMDE1KSkKIyFbbGVuZ3RoIGRpc3RyaWJ1dGlvbl0oL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9sZW5ndGhfZGlzdHJpYnV0aW9uOC9sZW5ndGhfZGlzdGlidXRpb24uc2xpZGUucG5nKQpgYGAKCiMgSzU2MiBDaElQLWV4byAxYnAgdnMgNTAgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczgvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNWV4MWJwNTBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1ZXgxYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgxYnA1MGJwIiwgMC4wMjUpKQpgYGAKCiMgSzU2MiBDaElQLWV4byAxMDBicCB2cyAxIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM3L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM4L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVleDIzcmFuZDEwMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVleDIzcmFuZDEwMGJwMWJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgyM3JhbmQxMDBicDFicCIsIDAuMDIyKSkKYGBgCgojIEs1NjIgQ2hJUC1leG8gMmJwIHZzIDEwMCBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yOF9TZWd3YXlfUnVuXzdfUmVzMi9nbXRrX3BhcmFtZXRlcnM0L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM3L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVleDJicDEwMGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVleDJicDEwMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgyYnAxMDBicCIsIDAuMDE1KSkKYGBgCgojIEs1NjIgQ2hJUC1leG8gMmJwIHZzIDMwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNWV4MmJwMzBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1ZXgyYnAzMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgyYnAzMGJwIiwgMC4wMikpCmBgYAoKI0s1NjIgQ2hJUC1leG8gMmJwIHZzIDUwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNWV4MmJwNTBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1ZXgyYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgyYnA1MGJwIiwgMC4wMTUpKQpgYGAKCiMgSzU2MiBDaElQLWV4byAzMGJwIHZzIDEwMCBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yMV9TZWd3YXlfUnVuXzVfUmVzMzAvZ210a19wYXJhbWV0ZXJzNC9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1ZXgzMGJwMTAwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNWV4MzBicDEwMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1ZXgzMGJwMTAwYnAiLCAwLjAyKSkKYGBgCgojIEs1NjIgQ2hJUC1leG8gMzAgYnAgdnMgMSBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yMV9TZWd3YXlfUnVuXzVfUmVzMzAvZ210a19wYXJhbWV0ZXJzNC9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzOC9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1ZXgzMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVleDMwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVleDMwYnAxYnAiLCAwLjAyNSkpCmBgYAoKIyBLNTYyIENoSVAtZXhvIDMwYnAgdnMgNTAgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNWV4MzBicDUwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNWV4MzBicDUwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVleDMwYnA1MGJwIiwgMC4wMikpCmBgYAoKIyBLNTYyIENoSVAtZXhvIDUwYnAgdnMgMTAwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI2X1NlZ3dheV9SdW5fNl9SZXM1MC9nbXRrX3BhcmFtZXRlcnM0L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM3L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVleDUwYnAxMDBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1ZXg1MGJwMTAwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVleDUwYnAxMDBicCIsIDAuMDIpKQpgYGAKCiNLNTYyIENoSVAtc2VxIDEwMGJwIHZzIDEgYnAgUmFuZCBTZWVkIDQKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wMV9TZWd3YXlfUnVuXzMvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTAxX1NlZ3dheV9SdW5fMy9nbXRrX3BhcmFtZXRlcnMyL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVzZXExMDBicDFicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1c2VxMTAwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXExMDBicDFicCIsIDAuMDIpKQpgYGAKCiMgSzU2MiBDaElQLXNlcSAxYnAgdnMgMmJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnMyL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1c2VxMWJwMmJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVzZXExYnAyYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXExYnAyYnAiLCAwLjAyNSkpCmBgYAoKIyBLNTYyIENoSVAtc2VxIDFicCB2cyA1MCBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzMi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yNl9TZWd3YXlfUnVuXzZfUmVzNTAvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVzZXExYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVzZXExYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1c2VxMWJwNTBicCIsIDAuMDM1KSkKYGBgCgojSzU2MiBDaElQLXNlcSAxMDBicCB2cyAxIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNXNlcTIzcmFuZDEwMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVzZXEyM3JhbmQxMDBicDFicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJLNXNlcTIzcmFuZDEwMGJwMWJwIiwgMC4wMykpCmBgYAoKI0s1NjIgQ2hJUC1zZXEgMmJwIHZzIDEwMCBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yOF9TZWd3YXlfUnVuXzdfUmVzMi9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1c2VxMmJwMTAwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNXNlcTJicDEwMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1c2VxMmJwMTAwYnAiLCAwLjAzKSkKYGBgCgojSzU2MiBDaElQLXNlcSAyYnAgdnMgMzAgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjhfU2Vnd2F5X1J1bl83X1JlczIvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTIxX1NlZ3dheV9SdW5fNV9SZXMzMC9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNXNlcTJicDMwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNXNlcTJicDMwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXEyYnAzMGJwIiwgMC4wMykpCmBgYAoKI0s1NjIgQ2hJUC1zZXEgMmJwIHZzIDUwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yNl9TZWd3YXlfUnVuXzZfUmVzNTAvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVzZXEyYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiSzVzZXEyYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIks1c2VxMmJwNTBicCIsIDAuMDMpKQpgYGAKCiNLNTYyIENoSVAtc2VxIDMwYnAgdnMgMTAwYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVzZXEzMGJwMTAwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNXNlcTMwYnAxMDBicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJLNXNlcTMwYnAxMDBicCIsIDAuMDQpKQpgYGAKCiNLNTYyIENoSVAtc2VxIDMwYnAgdnMgMWJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTIxX1NlZ3dheV9SdW5fNV9SZXMzMC9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJLNXNlcTMwYnAxYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJLNXNlcTMwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXEzMGJwMWJwIiwgMC4wMykpCmBgYAoKI0s1NjIgQ2hJUC1zZXEgMzAgYnAgY3MgNTAgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yNl9TZWd3YXlfUnVuXzZfUmVzNTAvZ210a19wYXJhbWV0ZXJzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiSzVzZXEzMGJwNTBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1c2VxMzBicDUwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiSzVzZXEzMGJwNTBicCIsIDAuMDQpKQpgYGAKCiNLNTYyIENoSVAtc2VxIDUwYnAgdnMgMTAwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI2X1NlZ3dheV9SdW5fNl9SZXM1MC9nbXRrX3BhcmFtZXRlcnMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVycy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIks1c2VxNTBicDEwMDBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIks1c2VxNTBicDEwMDBicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJLNXNlcTUwYnAxMDAwYnAiLCAwLjA0KSkKYGBgCgojTUNGNyBDaElQLWV4byAxMDAgYnAgdnMgMWJwIFJhbmQgU2VlZCA0CmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDFfU2Vnd2F5X1J1bl8zL2dtdGtfcGFyYW1ldGVyczUvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDFfU2Vnd2F5X1J1bl8zL2dtdGtfcGFyYW1ldGVyczYvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ2V4MTAwYnAxYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJNQ2V4MTAwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNleDEwMGJwMWJwIiwgMC4wMikpCmBgYAoKI01DRjcgLWV4byAxYnAgdnMgNTAgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczYvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ2V4MWJwNTBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1DZXgxYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIk1DZXgxYnA1MGJwIiwgMC4wMykpCmBgYAoKIyBNQ0Y3IGV4byAxMDAgYnAgdnMgMSBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNS9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1DZXgyM3JhbmQxMDBicDFicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1DZXgyM3JhbmQxMDBicDFicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ2V4MjNyYW5kMTAwYnAxYnAiLCAwLjAzKSkKYGBgCgojTUNGNyBleG8gMmJwIHZzIDEwMCBicCBSYW5kIFNlZWQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yOF9TZWd3YXlfUnVuXzdfUmVzMi9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM1L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNleDJicDEwMGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNleDJicDEwMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIk1DZXgyYnAxMDBicCIsIDAuMDMpKQpgYGAKCiNNQ0Y3IGV4byAyYnAgdnMgMzAgYnAgUmFuZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ2V4MmJwMzBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1DZXgyYnAzMGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIk1DZXgyYnAzMGJwIiwgMC4wMykpCmBgYAoKI01DRjcgQ2hJUC1leG8gMiBicCB2cyA1MCBicCBSYW5kIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjhfU2Vnd2F5X1J1bl83X1JlczIvZ210a19wYXJhbWV0ZXJzMy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yNl9TZWd3YXlfUnVuXzZfUmVzNTAvZ210a19wYXJhbWV0ZXJzMy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1DZXgyYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNleDJicDUwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNleDJicDUwYnAiLCAwLjA0KSkKYGBgCgojTUNGNyBleG8gMzAgYnAgdnMgMTAwIGJwIFJhbmQgU2VlZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTIxX1NlZ3dheV9SdW5fNV9SZXMzMC9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM1L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNleDMwYnAxMDBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1DZXgzMGJwMTAwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNleDMwYnAxMDBicCIsIDAuMDMpKQpgYGAKCiNNQ0Y3IGV4byAzMCBicCB2cyAxIGJwIFJhbmQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yMV9TZWd3YXlfUnVuXzVfUmVzMzAvZ210a19wYXJhbWV0ZXJzMy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1DZXgzMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNleDMwYnAxYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNleDMwYnAxYnAiLCAwLjAyNSkpCmBgYAoKI01DRjcgZXhvIDMwYnAgdnMgNTAgYnAgUmFuZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTIxX1NlZ3dheV9SdW5fNV9SZXMzMC9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI2X1NlZ3dheV9SdW5fNl9SZXM1MC9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNleDMwYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNleDMwYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIk1DZXgzMGJwNTBicCIsIDAuMDQpKQpgYGAKCiNNQ0Y3IGV4byA1MCBicCB2cyAxMDAgYnAgUmFuZCAyMwpgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTIxX1NlZ3dheV9SdW5fNV9SZXMzMC9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM1L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNleDUwYnAxMDBicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1DZXg1MGJwMTAwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNleDUwYnAxMDBicCIsIDAuMDMpKQpgYGAKCiNNQ0Y3IGV4byAxYnAgdnMgMmJwIFJhbmQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yOF9TZWd3YXlfUnVuXzdfUmVzMi9nbXRrX3BhcmFtZXRlcnMzL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNGZXgxYnAyYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJNQ0ZleDFicDJicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ0ZleDFicDJicCIsIDAuMDMpKQpgYGAKCiNNQ0Y3c2VxIDEwMCBicCB2cyAxIGJwIFJhbmQgU2VlZCA0CmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDFfU2Vnd2F5X1J1bl8zL2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDFfU2Vnd2F5X1J1bl8zL2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTEwMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXExMDBicDFicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ3NlcTEwMGJwMWJwIiwgMC4wMykpCmBgYAoKI01DRjdzZXEgMWJwIHZzIDJicCBSYW5kIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjhfU2Vnd2F5X1J1bl83X1JlczIvZ210a19wYXJhbWV0ZXJzMi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1Dc2VxMWJwMmJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXExYnAyYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNzZXExYnAyYnAiLCAwLjAzKSkKYGBgCgojTUNGNyBDaElQLXNlcSAgMSBicCB2cyA1MCBicApgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTA2X1NlZ3dheV9SdW5fNC9nbXRrX3BhcmFtZXRlcnM0L2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI2X1NlZ3dheV9SdW5fNl9SZXM1MC9nbXRrX3BhcmFtZXRlcnMyL2dtdGtfcGFyYW1ldGVycy5zdGF0cy5jc3YiLCAiTUNzZXExYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXExYnA1MGJwIikKZ2V0X2JpcGFydGl0ZShsb2FkLmRhdGEoIk1Dc2VxMWJwNTBicCIsIDAuMDMpKQpgYGAKCiNNQ0Y3IENoSVAtc2VxIDEwMGJwIHZzIDEgYnAgUmFuZCBTZWVkIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczQvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTIzcmFuZDEwMGJwMWJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXEyM3JhbmQxMDBicDFicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ3NlcTIzcmFuZDEwMGJwMWJwIiwgMC4wMykpCmBgYAoKI01DRjcgQ2hJUC1zZXEgMmJwIHZzIDEwMCBicApgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMDZfU2Vnd2F5X1J1bl80L2dtdGtfcGFyYW1ldGVyczMvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTJicDEwMGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXEyYnAxMDBicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ3NlcTJicDEwMGJwIiwgMC4wMykpCmBgYAoKI01DRjcgQ2hJUC1zZXEgMiBicCB2cyAzMCBicApgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTJicDMwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJNQ3NlcTJicDMwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNzZXEyYnAzMGJwIiwgMC4wNCkpCmBgYAoKI01DRjcgQ2hJUC1zZXEgMiBicCB2cyA1MCBicApgYGB7cn0KbWFrZV9yYXdfaGVhdG1hcCgiL3NjcmF0Y2gvbW9yZG9yL2hvZmZtYW5ncm91cC93eHUvZGF0YS8yMDE4LTA2LTI4X1NlZ3dheV9SdW5fN19SZXMyL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTJicDUwYnAiKQpwbG90X3Jlb3JkZXJfbGFiZWxzKCJNQ3NlcTJicDUwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNzZXEyYnA1MGJwIiwgMC4wNSkpCmBgYAoKI01DRjcgQ2hJUC1zZXEgMzAgYnAgdnMgMTAwIGJwIFJhbmQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yMV9TZWd3YXlfUnVuXzVfUmVzMzAvZ210a19wYXJhbWV0ZXJzMi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzMy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1Dc2VxMzBicDEwMGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXEzMGJwMTAwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNzZXEzMGJwMTAwYnAiLCAwLjA1KSkKYGBgCgojTUNGNyBDaElQLXNlcSAzMCBicCB2cyAxIGJwIFJhbmQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yMV9TZWd3YXlfUnVuXzVfUmVzMzAvZ210a19wYXJhbWV0ZXJzMi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzNC9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1Dc2VxMzBicDFicCIpCnBsb3RfcmVvcmRlcl9sYWJlbHMoIk1Dc2VxMzBicDFicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ3NlcTMwYnAxYnAiLCAwLjA1KSkKYGBgCgojTUNGNyBDaElQLXNlcSAzMCBicCB2cyA1MCBicCBSYW5kIDIzCmBgYHtyfQptYWtlX3Jhd19oZWF0bWFwKCIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjFfU2Vnd2F5X1J1bl81X1JlczMwL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICIvc2NyYXRjaC9tb3Jkb3IvaG9mZm1hbmdyb3VwL3d4dS9kYXRhLzIwMTgtMDYtMjZfU2Vnd2F5X1J1bl82X1JlczUwL2dtdGtfcGFyYW1ldGVyczIvZ210a19wYXJhbWV0ZXJzLnN0YXRzLmNzdiIsICJNQ3NlcTMwYnA1MGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXEzMGJwNTBicCIpCmdldF9iaXBhcnRpdGUobG9hZC5kYXRhKCJNQ3NlcTMwYnA1MGJwIiwgMC4wNSkpCmBgYAoKI01DRjcgQ2hJUC1zZXEgNTAgYnAgdnMgMTAwIGJwIFJhbmQgMjMKYGBge3J9Cm1ha2VfcmF3X2hlYXRtYXAoIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0yNl9TZWd3YXlfUnVuXzZfUmVzNTAvZ210a19wYXJhbWV0ZXJzMi9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIi9zY3JhdGNoL21vcmRvci9ob2ZmbWFuZ3JvdXAvd3h1L2RhdGEvMjAxOC0wNi0wNl9TZWd3YXlfUnVuXzQvZ210a19wYXJhbWV0ZXJzMy9nbXRrX3BhcmFtZXRlcnMuc3RhdHMuY3N2IiwgIk1Dc2VxNTBicDEwMGJwIikKcGxvdF9yZW9yZGVyX2xhYmVscygiTUNzZXE1MGJwMTAwYnAiKQpnZXRfYmlwYXJ0aXRlKGxvYWQuZGF0YSgiTUNzZXE1MGJwMTAwYnAiLCAwLjA0KSkKYGBgCgpybWFya2Rvd246OnJlbmRlcihNYXJyaWFnZWJ0UmVzb2x1dGlvbnNGaW5hbC5SbWQpCg==